package com.ywk.junit.test.runWithDemo;

/**
 * @Author zbh
 * @Date 2023/6/30
 */

//指定当前类为配置类，优于其他类先执行，替换applicationContext.xml文件

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * Spring框架访问数据库的两种方式的小案例：
 * 1.以Xml的方式访问数据库的案例
 * 2.以注解的方式访问数据库（此案例只展示注解方式）
 * 参考连接：https://www.cnblogs.com/z-z-s/archive/2021/10/18/15422540.html
 */
@Configuration
//@PropertySource用于指定 properties文件的位置以连接数据库
// 注：默认引入文件名 application.properties（后缀必须是 properties），
// web启动时文件名是默认的可以不用该注解，但是 junit 测试时需要使用该注解）
@PropertySource(value = "classpath:application.properties")
@ComponentScan("com.ywk.junit")//扫描对应包下的注解
public class SpringConfiguration {

    //引入配置文件db.properties的属性、值
    @Value("${db.username}")
    private String username;
    @Value("${db.password}")
    private String password;
    @Value("${db.url}")
    private String url;
    @Value("${db.driverClassName}")
    private String driverClassName;

    //把当前方法的返回值放在Spring容器中，相当于<bean id = "" class = "">
    //为了不再单独写一个数据源，将数据源（连接池）封装到JdbcTemplate，返回JdbcTemplate获得数据源
    @Bean
    public JdbcTemplate getJdbcTemplate(){
        //创建properties对象，为了获取数据源
        Properties properties = new Properties();
        //设置对应参数，获得对应数据源的值
        properties.setProperty("username",username);
        properties.setProperty("password",password);
        properties.setProperty("url",url);
        properties.setProperty("driverClassName",driverClassName);
        try {
            //通过连接池获取数据源
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            //返回Jdbc模版对象
            return new JdbcTemplate(dataSource);
        } catch (Exception e) {
            e.printStackTrace();
        }
        throw new RuntimeException("连接数据库异常");
    }
}
